Маленький туториал для MZ. Может кому-то будет полезно (особенно ввиду RTP-марафона).
Если было - сорян, не нашел.
На данный туториал меня "подбили" вопросы Скрипки и старая мысль, на что же способен мейкер без плагинов в контексте работы с внешними данными.
Будет три части:
I. Проверка наличия сохранений в принципе, получение кол-ва сохранений, удаление сохранений.
II. Частичная загрузка сохранений.
III. Лайфхак.
СпойлерПервую часть для MV можно найти в Общих вопросах, в ответе на вопросы Скрипки:
...вторую часть, вероятно, тоже можно сделать - экспериментируйте.
I. Проверка наличия сохранений в принципе, получение кол-ва сохранений, удаление сохранений.
Относительно стандартные действия, которые могут пригодится в ряде случаев.
СпойлерПроверка наличия сохранений в принципе, код для "Скрипта":
Код:
let isThereSaves = DataManager.isAnySavefileExists(); // вернет: true / false.
$gameSwitches.setValue(1, isThereSaves); // если нужно записать есть/нет в переключатель №1.
СпойлерПолучение кол-ва сохранений, код для "Скрипта":
Код:
if( true === DataManager.isAnySavefileExists() ){
const saveFilesList = DataManager._globalInfo;
const savesFullCount = saveFilesList.length; //полный подсчет, с учетом пропусков (если сохранение в слотах 1 и 3, то выдаст что сохранений 3).
const savesAccurateCount = saveFilesList.filter(save => save === save).length; //точный подсчет, с учетом пропусков (если сохранение в слотах 1 и 3, то выдаст что сохранений 2).
$gameVariables.setValue(2, savesAccurateCount); // если нужно записать точное кол-во сохранений в переменную №2.
}else{
console.log('_isThereSaves: false');
}
СпойлерУдаление сохранений:
Файл global.rmmzsave при этом не удаляется.
Запуск кода ниже - исключительно на вашей ответственности.
СпойлерНа свой страх и риск, я предупреждал! Код для "Скрипта":
Код:
if( true === DataManager.isAnySavefileExists() ){
const fs = require("fs"); const path = require('path');
let base = path.dirname(process.mainModule.filename); let savePath = path.join(base, 'save/');
const saveFilesCount = DataManager._globalInfo.length;
for(let n = 0; n < saveFilesCount; n++){
let currentSaveFilePath = savePath + DataManager.makeSavename(n) + '.rmmzsave'; console.log('_delete_currentSaveFilePath:', currentSaveFilePath);
try{ fs.unlinkSync(currentSaveFilePath);
}catch(error){ console.log('_error on deleting saves:', error); }
} console.log('_delete_save_files_process: OK');
}else{
console.log('_isThereSaves: false');
}
II. Частичная загрузка сохранений.
А вот тут интереснее, собственно ради этого я и создал данный мини-туториал.
Как мы знаем, по-дефолту при сохранении в файл записываются переменные, переключатели, локальные переключатели и много чего еще.
При загрузке, соответственно, это все выгружается и применяется мейкером.
Конечно, для сохранения данных (переключателей, переменных, итд) во внешний файл есть ряд плагинов, но...
Но что, если нужно чтоб мейкер выгрузил из "классического сохранения" данные, но их не применил?
То есть, можно ли использовыать классический файл сохранения как внешний источних данных?
Можно!
Т.к. такую возможность, скорее всего, удобнее использовать часто, то запишем функцию загрузки внутрь переменной мейкера:
СпойлерКод функции частичной загрузки данных, для "Скрипта":
Смысл - вызывать функцию, указывая нужный слот сохранения, и записывать результат в отдельную переменную мейкера.
где: N - номер переменной, куда сохранили фунцию. M - номер переменной, куда запишется результат частичной загрузки данных.
Как жы применить это? Сначала вызовем функцию.
СпойлерВызов частичной загрузки данных, для "Скрипта":
Код:
let halfLoader = $gameVariables.value(N);
let halfLoadResult = halfLoader(I);
где: N - номер переменной, куда сохранили фунцию. I - номер файла сохранения
После этого лучше поставить комнду Ждать, на 5-15 кадров (я ставлю на 15).
И, наконец, применение.
А) Просто вывод на консоль (или что-то делать в "Скрипте").
СпойлерВызов частичной загрузки данных, для "Скрипта":
Код:
try{
let halfLoadedData = $gameVariables.value(M);
console.log( halfLoadedData.switches.value(X) ); // получение значения переключателя X из загруженных данных на консоль.
}catch(error){ console.log('_ERROR, load result is:', error); }
где: M - номер переменной, куда записался результат частичной загрузки данных. X - номер интересующего нас переключателя из сохранения. try{}catch(error){} - нужны для отлова ошибки в случае, если данные не загрузились (если такого быть не может, не пишите их).
Б) Проверка в Условии
СпойлерВызов частичной загрузки данных, для Условия и скрипта в нем:
Код:
try{ 33 === $gameVariables.value(M).variables.value(Y); }catch(error){ false; } // получение значения переменной Y из загруженных данных и сравнения како-то числа с ней
где: M - номер переменной, куда записался результат частичной загрузки данных. Y - номер интересующей нас переменной из сохранения. try{}catch(error){} - нужны для отлова ошибки в случае, если данные не загрузились (если такого быть не может, не пишите их).
Конечно, это нужно в довольно редких случаях.
Но если у вас игра, связанная с "зацикливанием", и вы хотите сохранять только промежуточные результаты - это один из вариантов.
Вот перечень данных, которые можно достать из сохранения:
СпойлерНазвание объекта и что содержит:
Код:
system // содержит то же, что и $gameSystem
screen; // содержит то же, что и $gameScreen
timer; // содержит то же, что и $gameTimer
switches; // содержит то же, что и $gameSwitches
variables; // содержит то же, что и $gameVariables
selfSwitches; // содержит то же, что и $gameSelfSwitches
actors; // содержит то же, что и $gameActors
party; // содержит то же, что и $gameParty
map; // содержит то же, что и $gameMap
player;// содержит то же, что и $gamePlayer
III. Лайфхак.
Лайфхак относится к частичной загрузке сохранений.
Например, мы используем такой фокус и не хотим, что бы игрок с этого самого сохранения загружался.
Что делать?
По-дефолту, в мейкере 20 слотов сохранений.
Но сохранять вручную, скриптом, можно в любой слот, даже 20+...То есть сохранить в 21-й слот!
СпойлерКод для ручнуго сохранения в нужный слот, для "Скрипта":
Социальные закладки